﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpDevService.h"
#include <iostream>


// disable warning 4251
// 警告的原因是不同的std库的实现可能不一样
#pragma warning( disable : 4251 )

namespace gcmp
{
    /// \brief 文件路径类提供了对文件路径的封装以及操作
    class GCMP_DEV_SERVICE_EXPORT FilePath
    {
    public:
        /// \brief 构造函数
        /// \param filePath 文件路径字符串
        FilePath(const std::wstring& filePath);

        /// \brief 析构函数
        ~FilePath(void);

    public:
        /// \brief 返回路径字符串的目录信息，文件分割符结尾。
        std::wstring GetDirectoryName() const;

        /// \brief 返回路径字符串的扩展名。
        std::wstring GetExtension() const;

        /// \brief 返回路径字符串的文件名，包括扩展名。
        std::wstring GetFileName() const;

        /// \brief 返回不具有扩展名的路径字符串的文件名。
        std::wstring GetFileNameWithoutExtension() const;

        /// \brief 返回路径字符串的绝对路径。
        std::wstring GetFullPath() const;

        /// \brief 获取路径的根目录信息。
        std::wstring GetPathRoot() const;

        /// \brief 确定路径是否包括文件扩展名。
        bool HasExtension() const;

    public:
        /// \brief 拼接两个文件路径字符串
        /// \param part1 部分1
        /// \param part2 部分2
        /// \return std::wstring 拼接好的字符串
        static std::wstring Combine(const std::wstring &part1, const std::wstring &part2);

        /// \brief 拼接三个文件路径字符串
        /// \param part1 部分1
        /// \param part2 部分2
        /// \param part3 部分3
        /// \return std::wstring 拼接好的字符串
        static std::wstring Combine(const std::wstring &part1, const std::wstring &part2, const std::wstring &part3);

        /// \brief 判断是否是相对路径
        /// \param path 路径字符串
        /// \return bool 是相对路径返回true；不是返回false
        static bool IsRelativePath(const std::wstring& path);

        /// \brief 判断两个路径是否在同一个驱动上
        /// \param path1 路径1
        /// \param path2 路径2
        /// \return bool 在同一个驱动上返回true；不在同一个驱动上返回false
        static bool IsOnSameDrive(const std::wstring& path1, const std::wstring& path2);

        /// \brief 获取绝对路径
        /// \param relativePath 相对路径部分
        /// \param parentDir 相对路径的父文件夹
        /// \std::wstring 绝对路径
        static std::wstring GetAbsolutePath(const std::wstring& relativePath, const std::wstring &parentDir);

        /// \brief 获取相对路径
        /// \param fullPath 全路径
        /// \param parentDir 相对路径的父文件夹
        /// \std::wstring 相对路径
        static std::wstring GetRelativePath(const std::wstring& fullPath, const std::wstring &parentDir);

    private:
        std::wstring m_drive;
        std::wstring m_directory;
        std::wstring m_filename;
        std::wstring m_extension;
    };
}


